package cn.doitedu.day06

/**
 * 介绍柯里化方法
 * 方法的有多个括号可以传参
 * 柯里化方法的特点：
 *  1.多个括号，可以更加明确每个括号的参数的作用
 *  2.柯里化方法可以结合隐式参数一起使用
 *
 *  implicit可以修饰变量、方法、函数
 */
object KeLiDemo2 {

  implicit val m = 6

  def k2(x: Int)(implicit y: Int): Int = {
    x + y
  }

  def k3(x: Int)(implicit y: Int = 10): Int = {
    x + y
  }


  def main(args: Array[String]): Unit = {
    //查找程序中可以找到了用implicit修饰的Int的参数
    //val r1 = k2(5)
    //可以自己传入
    //val r2 = k2(5)(8)
    //println(r1)

    //优先级：认为指定输入的参数 > 上下文中类型一样的隐式参数 > 方法中的默认值
    //val r3 = k3(5)(8)
    val r3 = k3(5)
    println(r3)


    val arr: Array[Int] = Array(1,2,3,4,5)
    //柯里化方法结合隐式参数
    //比如sortBy就是一个柯里化方法，第一个参数传入比较的函数，第二个参数传入的是比较规则（scala中各种类型有默认的比较规则）
    //implicit object Int extends IntOrdering，又找到了Ordering[Int]
    arr.sortBy(x => x)
    //普通方法结合隐式参数
    arr.sorted


  }

}
